import json
import requests
import uuid
from django.contrib.auth import login
from django.http import JsonResponse, HttpResponseBadRequest, HttpResponseServerError
from django.shortcuts import render
# Create your views here.
from django.views import View
from django.conf import settings

from apps.OAauth.models import OAthOAUser
from apps.users.models import User, Userwallet
import logging

from internal_mall.settings import redirect_userinfo

logger = logging.getLogger('mall.log')


class AuthOAurlView(View):
    """提供OA登录页面网址
    """
    def get(self, request):
        """
        内部商城逻辑：
            1.前端点击第三方登录，
            2.请求视图函数生成随机码
            3.把随机码和回调url加到第三方登录url中返回给前端
            4.前端访问url
                code:本次登录唯一标识（放在回调地址里面）
                redirect_uri：回调地址
                state： 标记值，⽤于防⽌csrf攻击。给他个固定值
            5.登录OA系统
            6.OA系统返回token
            7.使用token访问OA获取用户信息
            8.获取用户信息，绑定商城，
            登录完毕
        OA处理逻辑：
            登录
                编写认证登录逻辑 请求进来返回登录页面进行用户登录
                登录之后请求redirect_uri并且携带当前用户的token(request.post)
                回调地址（redirect_oacallback）访问函数(AuthOAUserView)
            返回用户信息
                获取token，查询用户，根据redirect_uri返回用户信息

        """
        # 生成随机码一起加到回调url中
        # login_url = 'https://www.baidu.com'
        login_url = f'http://192.168.101.73:8888/center/login_auths/?redirect_uri={settings.redirect_oacallback}&state={settings.SECRET_KEY}'
        return JsonResponse({'code': 0,
                             'errmsg': 'OK',
                             'login_url': login_url})


class AuthOAUserView(View):
    """用户扫码登录的回调处理
    在OA登陆成功重定向到回调网址时，会给我们一个token。
    我们需要拿到token去OA数据库查询该用户(requests.post)
    """
    def post(self, request):
        data = json.loads(request.body)
        token = data['token']  # 获取用户token
        print(token)
        url = 'http://192.168.101.73:8888/center/auths/'  # 请求url获取用户信息
        data = {'token': token, 'redirect_uri': redirect_userinfo}
        data = json.dumps(data)
        headers = {'content-Type': 'application/json', 'Accept': '*/*'}
        response = requests.post(url=url, data=data, headers=headers)
        return JsonResponse(response.text, safe=False)


class AuthOAuserinfoView(View):
    """接收OA用户信息，绑定用户
        内部商城查找数据
        如果有，保存当前用户的状态，
        如果没有，创建该用户并且创建该用户的账户表
        然后保存状态
    """

    def post(self, request):
        datas = json.loads(request.body)
        name = datas['name']
        telephone = datas['telephone']
        email = datas['email']
        # workers = datas['workers']
        workers = '112233'
        # print(name, telephone)
        password = '12345678'
        OAuser = OAthOAUser.objects.filter(workers=workers).first()
        user = User.objects.filter(username=name).first()
        if OAuser is None:  # 判断是否有此用户的记录
            # if user is None: # OAuser为空判断user是否有此用户
            try:
                user = User.objects.create_user(username=name, password=password, mobile=telephone, email=email) #注册此员工
                new_wallet = Userwallet(user=user, wallet_income=0)  # 注册成功创建此用户的账户表，默认资产为0
                new_wallet.save()
                new_OAuser = OAthOAUser(workers=workers, user=user) #根据工号绑定此用户
                new_OAuser.save()
            except Exception as e: #如果出错记录日志返回400
                logger.info(e)
                return JsonResponse({'code': 400, 'errmsg': '失败!'})
            login(request, user)
            response = JsonResponse({'code': 200, 'error': '登陆成功'})
            u = json.dumps(user.nick_name)  # 用户名序列化
            # print(user.nick_name)
            response.set_cookie("username", u)  # 用户名写入cookie
            return response
        else:  # 不为空 状态保持返回给前端
            login(request, OAuser.user)
            response = JsonResponse({'code': 200, 'error': '登陆成功'})
            u = json.dumps(OAuser.user.nick_name)  # 用户名序列化
            # print(user.nick_name)
            response.set_cookie("username", u)  # 用户名写入cookie
            return response
